#ifndef HTTP_CONN_H
#define HTTP_CONN_H
#include <sys/types.h>
#include <sys/uio.h>     // readv/writev
#include <arpa/inet.h>   // sockaddr_in
#include <stdlib.h>      // atoi()
#include <errno.h>      

#include "../log/log.h"
#include "../pool/sqlconnRAII.h"
#include "../buffer/buffer.h"
#include "httprequest.h"
#include "httpresponse.h"

class HttpConn
{
public:
    //构造函数，用于初始化HHTP连接对象
    HttpConn();
    //析构函数，释放连接相关资源
    ~HttpConn();
    //初始化HTTP连接对象，设置套接字描述符和客户端地址
    void init(int sockFd,const sockaddr_in& addr);
    //从套接字中读取数据
    ssize_t read(int* saveErrno);
    //将数据写入套接字
    ssize_t write(int* saveErrno);
    //关闭连接，释放相关资源
    void Close();
    //获取套接字的文件描述符
    int GetFd() const;
    //获取客户端端口
    int GetPort() const;
    //获取客户端IP地址
    const char* GetIP() const;
    //获取客户端地址结构体
    sockaddr_in GetAddr() const;
    //处理HTTP请求，解析请求头和请求体
    bool process();
    //获取待写入字节数
    int ToWriteBytes()
    {
        //返回待写入字节数
        return iov_[0].iov_len + iov_[1].iov_len;
    }
    //判断是否保持长连接，根据request_对象的IsKeepAlive()方法判断
    bool IsKeepAlive() const 
    {
        //返回请求是否保持长连接
        return request_.IsKeepAlive();
    }
    //是否开启了ET模式
    static bool isET;
    //静态成员变量，用来存储静态资源的目录
    static const char* srcDir;
    //静态成员变量，用来统计当前连接的用户数量
    static std::atomic<int> userCount;
private:  
    //套接字文件描述符
    int fd_;
    //客户端地址结构体
    struct sockaddr_in addr_;
    //是否关闭连接
    bool isClose_;
    //IO向量计数              
    int iovCnt_;
    //IO向量数组，用于存储待写入数据
    struct iovec iov_[2];
    //读取缓冲区
    Buffer readBuff_;
    //写入缓冲区
    Buffer writeBuff_;
    //HTTP请求对象
    HttpRequest request_;
    //HTTP响应对象
    HttpResponse response_;
};
#endif